/*
 * lorenz.hpp
 *
 * Copyright 2009-2012 Karsten Ahnert
 * Copyright 2009-2012 Mario Mulansky
 *
 * Distributed under the Boost Software License, Version 1.0.
 * (See accompanying file LICENSE_1_0.txt or
 * copy at http://www.boost.org/LICENSE_1_0.txt)
 */

#ifndef LORENZ_HPP_
#define LORENZ_HPP_

#include <boost/array.hpp>

struct lorenz {
  template <class state_type>
  void inline operator()(const state_type& x, state_type& dxdt, const double t) const {
    const double sigma = 10.0;
    const double R = 28.0;
    const double b = 8.0 / 3.0;
    dxdt[0] = sigma * (x[1] - x[0]);
    dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
    dxdt[2] = x[0] * x[1] - b * x[2];
  }
};

typedef boost::array<double, 3> state_type;

inline void lorenz_func(const state_type& x, state_type& dxdt, const double t) {
  const double sigma = 10.0;
  const double R = 28.0;
  const double b = 8.0 / 3.0;
  dxdt[0] = sigma * (x[1] - x[0]);
  dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
  dxdt[2] = x[0] * x[1] - b * x[2];
}

#endif /* LORENZ_HPP_ */
